function fn1(): never {
  throw new Error('never 返回值用于异常抛出的情况')
}

/**
 * [propName: string] 中的 propName 表示属性名称，比如前面的 name 这种.
 * 因为后面要添加不确定个数的参数，所以这里给未知的参数名字取个名字。
 * string 表示 propName 的类型，因为参数的名称肯定是字符串的。
 * 
 * 后面的 any 表示可以传入任意类型的参数。
 * 
 * 这样声明后，obj 就可以在 name 之外设置任意多的属性
 * 
 */
let obj : {name: string, [propName: string]: any}
obj = {name: '张三', age: 18, score: 99.5}

/**
 * 限制函数的参数类型和返回值类型
 */
let f : (a: number, b: number) => number
f = function(x, y) {
  return x + y
}

/**
 * 限制数组类型
 */
let arr : string[]
arr = ['a', 'b', 'c']
let arr2 : Array<number>
arr2 = [1, 2, 3]

/**
 * 限制元组的类型
 */
let t : [string, number]
t = ['leon', 20]


/**
 * 枚举
 */
enum Gender {
  MALE,
  FEMALE
}

let i = {
  name: 'leon',
  gender: Gender.MALE
}